import axios from 'axios'
import { getDomain } from '@/config'

export default function ({
    isFomatRes = true, // 是否处理返回的res数据
    isFormData = false, // 是否是表单数据
    method = 'GET',
    url,
    params,
    timeout = 3000
} = {}) {
    let baseURL = getDomain()
    // 创建自定义axios实例
    const instance = axios.create({
        baseURL,
        timeout,
        headers: {
            // 如果不显示的设置Content-Type，那么默认是text/plain,使用表单形式提交'multipart/form-data'（即FormData提交的参数）
            'Content-Type': isFormData ? 'multipart/form-data;charset=UTF-8' : 'application/x-www-form-urlencoded;charset=UTF-8'
        },
        transformRequest: [function (data) {
            if (isFormData) {
                return data
            }
            let ret = ''
            for (const key in data) {
                // 值为空
                if (data[key] === null || data[key] === '' || data[key] === undefined) {
                    ret += key + '=&'
                } else if ((typeof data[key]) === 'number') { // 值为number类型
                    ret += key + '=' + data[key] + '&'
                } else {
                    ret += key + '=' + encodeURIComponent(data[key]) + '&'
                }
            }
            return ret
        }]
        // `responseType` 表示服务器响应的数据类型，可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
        // responseType: 'json',
        // 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise
        // 大于等于200 小于300 通过校验 resolve,否则是reject
        // validateStatus (status) {
        //   return status >= 200 && status < 300 // 默认的
        // }
    })

    // 创建请求拦截器，可以再发送请求之前做些处理
    instance.interceptors.request.use(config => {
        return config
    }, error => {
        return Promise.reject(error)
    })

    // 创建响应拦截器，在响应被then方法执行之前做处理
    instance.interceptors.response.use(response => {
        return response.data
    }, error => {
        return Promise.reject(error)
    })

    const axiosConfig = {
        url, // `url` 是用于请求的服务器 URL
        method// `method` 是创建请求时使用的方法
    }
    if (method === 'POST') { // POST请求传参
        axiosConfig.data = params
    } else { // GET请求传参
        axiosConfig.params = params
    }

    return new Promise((resolve, reject) => {
        instance(axiosConfig).then(function (res) {
            if (isFomatRes) {
                switch (res.code) {
                    case 200: // 成功
                        resolve(res.data || {})
                        break
                    case 400: // 失败
                    case 401: // 业务失败
                    default:
                        reject(res)
                        break
                }
            } else {
                resolve(res)
            }
        }).catch(function (err) {
            reject(err)
        })
    })
}
